﻿''' <summary>
''' Speichert die Informationen für die Kampagnen ab.
''' Was gewonnen,verloren und auswählbar sind....
''' </summary>
''' <remarks></remarks>
<Serializable()> Public Class ObjektLandkartenInfos
    Public HintergrundsBild As String
    ''' <summary>
    ''' Er sollte dann etwa so aussehen: *.kamp\
    ''' </summary>
    ''' <remarks></remarks>
    Public KampagnenOrdner As String

    Public Missionen As Mission() = {}
    Shared Komprimiert As Boolean
    ''' <summary>
    ''' Wird AUSSCHLIEßLICH zum Komprimieren benutzt.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Shared Datei As String
    Public BlockierteEinheiten() As BlockierteEinheit = {}
    Public Spielmodus As CommanderWarsGameModi = My.Settings.CommanderWarsGameMoodus
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="Datei">Der komplette Dateipfad wird jetzt aus gelesen</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal Datei As String)
        Komprimiert = False
        ObjektLandkartenInfos.Datei = ""
        HintergrundsBild = ""
        Dim strR As New IO.StreamReader(Datei, System.Text.Encoding.Default)
        While Not strR.EndOfStream
            Dim z As String = strR.ReadLine
            z = z.Trim
            If z.Contains("//") Then
                z = z.Remove(z.IndexOf("//"))
            End If
            z = z.Trim

            If z.ToLower = "komprimiert=1" Then
                Komprimiert = True
            End If
            If Not Komprimiert Then
                ObjektLandkartenInfos.Datei += Environment.NewLine + z  'Noch eine Aufzeichnung machen.
            End If


            If z.ToLower.StartsWith("hintergrund:") Then
                HintergrundsBild = z.Remove(0, 12)
                Continue While
            End If

            If z.ToLower.StartsWith("mission|") Then
                Dim infos() As String = z.Split("|")
                If Komprimiert Then
                    NeueMission(infos(1), infos(2), infos(6), Color.FromArgb(255, CInt(infos(3)), CInt(infos(4)), CInt(infos(5))), infos(7), infos(8), infos(9), infos(10))
                Else
                    NeueMission(infos(1), infos(2), infos(6), Color.FromArgb(255, CInt(infos(3)), CInt(infos(4)), CInt(infos(5))))
                End If
            End If
            'Wir wollen das man manche Einheiten nicht bauen kann.
            If z.ToLower.StartsWith("blockierteeinheit:") Then
                z = z.Remove(0, 18)
                Dim infos() As String = z.Split("|")
                AddBlockierteEinheit(infos(0), infos(1))
            End If

            If z.ToLower.StartsWith("gamemode:") Then
                Spielmodus = z.Remove(0, 9) - 1
                If Spielmodus >= 0 Then
                    If Spielmodus <> My.Settings.CommanderWarsGameMoodus Then
                        My.Settings.CommanderWarsGameMoodus = Spielmodus
                        Objektverwalter.LoadNewGameModus(My.Settings.TerrainStyle)
                    End If
                Else
                    Spielmodus = My.Settings.CommanderWarsGameMoodus
                End If
            End If
        End While
        strR.Dispose()

        If Not Komprimiert Then
            'Na gut dann eben noch komprimiert abspeichern
            Try
                My.Computer.FileSystem.WriteAllText(Datei, "Komprimiert=1" + ObjektLandkartenInfos.Datei, False, System.Text.Encoding.Default)
            Catch
                My.Computer.FileSystem.WriteAllText(Datei + ".comp", "Komprimiert=1" + ObjektLandkartenInfos.Datei, False, System.Text.Encoding.Default)
            End Try
        End If
    End Sub

    Private Sub NeueMission(ByVal Bildname As String, ByVal Kartenname As String, ByVal Zustand As Integer, ByVal Siegfarbe As Color)
        Array.Resize(Missionen, Missionen.Length + 1)
        Missionen(Missionen.Length - 1) = New Mission(Kartenname, Zustand, Bildname, Siegfarbe)
    End Sub
    Private Sub NeueMission(ByVal Bildname As String, ByVal Kartenname As String, ByVal Zustand As Integer, ByVal Siegfarbe As Color, ByVal KooX As Integer, ByVal KooY As Integer, ByVal MitteX As Integer, ByVal MitteY As Integer)
        Array.Resize(Missionen, Missionen.Length + 1)
        Missionen(Missionen.Length - 1) = New Mission(Kartenname, Zustand, Bildname, Siegfarbe, KooX, KooY, MitteX, MitteY)
    End Sub

    <Serializable()> Structure BlockierteEinheit
        Dim EinheitenID As String
        Dim Armee As String
        Public Sub New(ByVal EinheitenID As String, ByVal Armee As String)
            Me.EinheitenID = EinheitenID
            Me.Armee = Armee
        End Sub
    End Structure
    Public Sub AddBlockierteEinheit(ByVal EinheitenID As String, ByVal Armee As String)
        For I = 0 To BlockierteEinheiten.Length - 1
            If BlockierteEinheiten(I).Armee = Armee And BlockierteEinheiten(I).EinheitenID = EinheitenID Then
                Exit Sub
            End If
        Next
        Array.Resize(BlockierteEinheiten, BlockierteEinheiten.Length + 1)
        BlockierteEinheiten(BlockierteEinheiten.Length - 1) = New BlockierteEinheit(EinheitenID, Armee)
    End Sub
    Public Sub RemoveBlockierteEinheit(ByVal EinheitenID As String, ByVal Armee As String)
        For I = 0 To BlockierteEinheiten.Length - 1
            If BlockierteEinheiten(I).Armee = Armee And BlockierteEinheiten(I).EinheitenID = EinheitenID Then
                BlockierteEinheiten(I) = BlockierteEinheiten(BlockierteEinheiten.Length - 1)
                Array.Resize(BlockierteEinheiten, BlockierteEinheiten.Length - 1)
                Exit For
            End If
        Next
    End Sub
End Class
<Serializable()> Public Class Mission
    Enum MissionsZustände
        NichtAnwählbar
        Anwählbar
        Ausgewählt
        Gewonnen
        Verloren
    End Enum
    Public Missionsname As String = ""
    Dim Bildname As String = ""
    Dim Siegfarbe As Color = Color.Lime
    Dim KooX, KooY, MitteX, MitteY As Integer
    Public MissionsZustand As MissionsZustände = MissionsZustände.NichtAnwählbar
    Public Sub New(ByVal Name As String, ByVal Zustand As MissionsZustände, ByVal Bildname As String, ByVal Siegfarbe As Color)
        Missionsname = Name
        MissionsZustand = Zustand
        Me.Bildname = Bildname
        Me.Siegfarbe = Siegfarbe
        Dim BildOrg As Bitmap = Image.FromFile(My.Settings.Resourcenpfad + "Landkarten\" + Bildname + ".png")
        Dim Xr As Integer = -1 'Erstmal alles ungültige Werte
        Dim Yu As Integer = -1
        KooX = -1
        KooY = -1
        For X = 0 To BildOrg.Width - 1
            For Y = 0 To BildOrg.Height - 1
                If Not BildOrg.GetPixel(X, Y).A = 0 Then
                    'Hier ist irgendetwas gemalt, wenn auch vielleicht nur schwach...
                    If KooX = -1 Then KooX = X 'kleinster X-Wert
                    If KooY = -1 Then KooY = Y 'kleinster Y-Wert
                    If KooY > Y Then KooY = Y
                    Xr = X 'bis jetzt der Wert der am weitesten Rechts ist!
                    If Yu < Y Then Yu = Y 'entsprechend mit Y.
                End If
            Next
        Next
        'Hoffentlich hat jetzt keiner der Werte den Wert -1!
        'Wenn das jetzt nicht allzulange gedauert hat, können wir noch weitermachen.
        MitteX = (KooX + Xr) / 2 'der gute alte Durchschnitt sorgt für den Mittelpunkt.
        MitteY = (KooY + Yu) / 2
        'Das Bild muss noch ausgeschnitten werden.
        Dim BildNeu As New Bitmap(Xr - KooX + 1, Yu - KooY + 1) 'Das ist die Richtige Größe
        For X = 0 To BildNeu.Width - 1 'uuuuuuuuuund abmalen, viel spaß, ich schau in ner Stunde wieder vorbei!
            For Y = 0 To BildNeu.Height - 1
                BildNeu.SetPixel(X, Y, BildOrg.GetPixel(KooX + X, KooY + Y))
            Next
        Next
        'Die Arbeit möchte ich nicht nochmal machen...
        BildNeu.Save(My.Settings.Resourcenpfad + "Landkarten\Komprimiert\" + Bildname + ".png")



        ' S C H A T T E N :
        BildNeu = New Bitmap(Xr - KooX + 1, Yu - KooY + 1) 'Das ist die Richtige Größe
        BildOrg = Image.FromFile(My.Settings.Resourcenpfad + "Landkarten\" + Bildname + "_Schatten.png")
        For X = 0 To BildNeu.Width - 1 'uuuuuuuuuund abmalen, viel spaß, ich schau in ner Stunde wieder vorbei!
            For Y = 0 To BildNeu.Height - 1
                BildNeu.SetPixel(X, Y, BildOrg.GetPixel(KooX + X, KooY + Y))
            Next
        Next
        'Die Arbeit möchte ich nicht nochmal machen...
        BildNeu.Save(My.Settings.Resourcenpfad + "Landkarten\Komprimiert\" + Bildname + "_Schatten.png")


        ObjektLandkartenInfos.Datei += "|" + KooX.ToString + "|" + KooY.ToString + "|" + MitteX.ToString + "|" + MitteY.ToString
    End Sub
    Public Sub New(ByVal Name As String, ByVal Zustand As MissionsZustände, ByVal Bildname As String, ByVal Siegfarbe As Color, ByVal KooX As Integer, ByVal KooY As Integer, ByVal MitteX As Integer, ByVal MitteY As Integer)
        Missionsname = Name
        MissionsZustand = Zustand
        Me.Bildname = Bildname
        Me.Siegfarbe = Siegfarbe
        Me.KooX = KooX
        Me.KooY = KooY
        Me.MitteX = MitteX
        Me.MitteY = MitteY
    End Sub

    Public Function isAuswählbar() As Boolean
        If MissionsZustand = MissionsZustände.Anwählbar Then Return True
        If MissionsZustand = MissionsZustände.Ausgewählt Then Return True
        Return False
    End Function

  
    Public Function getBildname(Optional ByVal Schatten As Boolean = False) As String
        If Schatten Then
            Return Bildname + "_Schatten"
        Else
            Return Bildname
        End If
    End Function
    Public Function getIntColor(Optional ByVal Schatten As Boolean = False) As Color
        If Schatten Then
            Return Color.FromArgb(255, 255, 255, 255) 'Schatten werden generell ohne verfärbungen gemalt.
        Else
            Select Case MissionsZustand
                Case MissionsZustände.NichtAnwählbar, MissionsZustände.Verloren 'Grau darstellen...
                    Return Color.FromArgb(255, 200, 200, 200)
                Case MissionsZustände.Gewonnen 'In der jeweiligen Farbe darstellen.
                    Return Siegfarbe
                Case Else 'Andernfalls normal malen.
                    Return Color.FromArgb(255, 255, 255, 255)
            End Select
        End If
    End Function
    Public Function getBildKooX(Optional ByVal Mitte As Boolean = False) As Integer
        If Mitte Then
            Return MitteX
        Else
            Return KooX
        End If
    End Function
    Public Function getBildKooY(Optional ByVal Mitte As Boolean = False) As Integer
        If Mitte Then
            Return MitteY
        Else
            Return KooY
        End If
    End Function

    Public Sub ZustandGewonnen()
        MissionsZustand = MissionsZustände.Gewonnen
    End Sub
    Public Sub ZustandAuswählbar()
        MissionsZustand = MissionsZustände.Anwählbar
    End Sub
End Class